#include "terrabrush.h"
#include "terramodel.h"
#include "../external/transformable/transformable.h"
#include <QDebug>

TerraBrush::TerraBrush() {}

void TerraBrush::begin(double px, double py, int flag)
{
    _draw_flag = 1;
    _flag = flag;

    if (_flag) {
        draw(px, py);
    } else {
        erase(px, py);
    }
}

void TerraBrush::move(double px, double py)
{
    if (_draw_flag)
    {
        if (_flag) {
            draw(px,py);
        } else {
            erase(px, py);
        }
    }
}

void TerraBrush::end(double px, double py)
{
    _draw_flag = 0;
}

void TerraBrush::draw(double px, double py)
{
    // 像素范围转坐标范围
    double x_min, x_max, y_min, y_max;
    TRANS->pixelToMap(px - radius, py + radius, x_min, y_min);
    TRANS->pixelToMap(px + radius, py - radius, x_max, y_max);

    // 坐标范围转索引范围
    int ix_min, ix_max, iy_min, iy_max;
    terra_model->coordinateToIndex(x_min, y_min, ix_min, iy_min);
    terra_model->coordinateToIndex(x_max, y_max, ix_max, iy_max);

    // 锁定访问
    std::unique_lock<std::mutex> lock(terra_model->_grids_mtx);

    // 批量赋值
    for (int i = ix_min; i <= ix_max; ++i)
    {
        for (int j = iy_min; j <= iy_max; ++j)
        {
            terra_model->_grids->integrate(i, j, terra_model->_material);
        }
    }
}

void TerraBrush::erase(double px, double py)
{
    // 像素范围转坐标范围
    double x_min, x_max, y_min, y_max;
    TRANS->pixelToMap(px - radius, py + radius, x_min, y_min);
    TRANS->pixelToMap(px + radius, py - radius, x_max, y_max);

    // 坐标范围转索引范围
    int ix_min, ix_max, iy_min, iy_max;
    terra_model->coordinateToIndex(x_min, y_min, ix_min, iy_min);
    terra_model->coordinateToIndex(x_max, y_max, ix_max, iy_max);

    // 锁定访问
    std::unique_lock<std::mutex> lock(terra_model->_grids_mtx);

    // 批量移除
    for (int i = ix_min; i <= ix_max; ++i)
    {
        for (int j = iy_min; j <= iy_max; ++j)
        {
            terra_model->_grids->remove(i, j);
        }
    }
}
